/**
 * getRandom - 获取某个范围内的随机整数的函数
 * @param {number} a 表示范围的数字
 * @param {number} b 表示范围的数字
 * @return {number} 返回范围内的随机数
 */
function getRandom(a, b) {
  // var max = a;
  // var min = b;
  // if(a<b){
  //     max = b;
  //     min = a
  // }
  var max = Math.max(a, b);
  var min = Math.min(a, b);
  return parseInt(Math.random() * Math.abs(a - b)) + min;
}
/**
 * getColor 获取随机颜色值的函数
 * @param {boolean} hex 是否要16进制的颜色值
 * @return {string} 返回的是颜色值
 */
function getColor(hex) {
  // 判断是否需要16进制的颜色值 - hex是不是true
  if (hex === true) {
    var color = "#";
    for (var i = 0; i < 3; i++) {
      var num = getRandom(0, 256);
      num = num.toString(16);
      num = num.length === 1 ? "0" + num : num;
      color += num;
    }
  } else {
    // var arr = []
    // for(var i=0;i<3;i++){
    //     var num = getRandom(0,256)
    //     arr.push(num)
    // }
    // var color = 'rgb(' + arr.join(',') + ')'

    var color = "rgb(";
    var f = "";
    for (var i = 0; i < 3; i++) {
      color += f + getRandom(0, 256);
      f = ",";
    }
    color += ")";
  }
  return color;
}
/**
 * getStyle 万能的获取样式的函数
 * @param {node} ele 要获取样式的标签对象
 * @param {string} attr 要获取的css的键
 * @return {string} 返回的是获取到的样式的值
 */
function getStyle(ele, attr) {
  try {
    return getComputedStyle(ele)[attr];
  } catch (err) {
    return ele.currentStyle[attr];
  }
}
/**
 * 兼容的事件侦听器
 * @param {node} ele 要绑定事件的标签元素
 * @param {string} type 事件类型
 * @param {function} handler 事件处理函数
 */
function bindEvent(ele, type, handler) {
  if (ele.addEventListener) {
    ele.addEventListener(type, handler);
  } else if (ele.attachEvent) {
    ele.attachEvent("on" + type, handler);
  }
}
/**
 * 兼容的事件侦听器对应的解绑函数
 * @param {node} ele 要解绑事件的标签元素
 * @param {string} type 事件类型
 * @param {function} handler 事件处理函数
 */
function unBind(ele, type, handler) {
  if (ele.removeEventListener) {
    ele.removeEventListener(type, handler);
  } else if (ele.detachEvent) {
    ele.detachEvent("on" + type, handler);
  }
}
/**
 * 批量设置样式的函数
 * @param {node} ele 要修饰样式的标签对象
 * @param {object} obj css键值对组成的对象
 */
function setStyle(ele, obj) {
  for (var attr in obj) {
    ele.style[attr] = obj[attr];
  }
}
/**
 * animate动画函数
 * @param {node} ele 要进行动画的元素
 * @param {object} obj 要进行动画的css键值对
 * @param {function} fn 所有动画结束后执行的函数
 */
function animate(ele, obj, fn = function () {}) {
  let num = 0;
  for (let attr in obj) {
    num++;
    let target = obj[attr];
    if (attr === "opacity") {
      target *= 100;
    }
    let currentStyle = getStyle(ele, attr);
    if (attr === "opacity") {
      currentStyle *= 100;
    }
    currentStyle = parseInt(currentStyle);
    let timerId = setInterval(function () {
      let speed = (target - currentStyle) / 10;
      speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
      currentStyle += speed;
      if (attr === "opacity") {
        ele.style[attr] = currentStyle / 100;
      } else {
        ele.style[attr] = currentStyle + "px";
      }
      if (currentStyle === target) {
        clearInterval(timerId);
        num--;
        if (num === 0) {
          fn();
        }
      }
    }, 20);
  }
}
/**
 * 发送ajax
 * @param {object} obj
 */
function sendAjax(obj){
  if(obj.url === undefined){
      throw new Error('地址必填')
  }
  if(typeof obj.url !== 'string'){
      throw new Error('地址必须是字符串')
  }
  if(obj.method === undefined){
      obj.method = 'get'
  }
  if(obj.method.toLowerCase() !== 'get' && obj.method.toLowerCase() !== 'post'){
      throw new Error('请求方式必须是get或post')
  }
  if(obj.dataType === undefined){
      obj.dataType = 'json'
  }
  if(obj.dataType.toLowerCase() !== 'json' && obj.dataType.toLowerCase() !== 'xml' && obj.dataType.toLowerCase() !== 'text'){
      throw new Error('dataType必须是json或xml或text')
  }
  if(obj.success === undefined){
      obj.success = function(){}
  }
  if(typeof obj.success !== 'function'){
      throw new Error('success必须是函数')
  }
  if(obj.data !== undefined){
      if(typeof obj.data === 'string'){
          var str = obj.data
      }else if(typeof obj.data === 'object'){
          var str = '';
          for(var attr in obj.data){
              str += '&' + attr + '=' + obj.data[attr]
          }
          str = str.slice(1)
      }else{
          throw new Error('数据必须是字符串或对象')
      }
      if(obj.method.toLowerCase() === 'get'){
          obj.url += '?' + str
      }
  }
  var xhr = new XMLHttpRequest;
  xhr.onreadystatechange = function(){
      if(xhr.readyState === 4){
          if(xhr.status>=200 && xhr.status<300){
              switch(obj.dataType){
                  case 'json':
                      var res = xhr.responseText;
                      res = JSON.parse(res)
                  break;
                  case 'xml':
                      var res = xhr.responseXML;
                  break;
                  case 'text':
                      var res = xhr.responseText;
                  break;
              }
              obj.success(res)
          }
      }
  }
  xhr.open(obj.method, obj.url)
  if(obj.method.toLowerCase() === 'post' && obj.data){
      xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
      xhr.send(str)
      return
  }
  xhr.send()
}

function promiseAjax(obj) {
  return new Promise(function (resolve, reject) {
    if (obj.url === undefined) {
      throw new Error("地址必填");
    }
    if (typeof obj.url !== "string") {
      throw new Error("地址必须是字符串");
    }
    if (obj.method === undefined) {
      obj.method = "get";
    }
    if (
      obj.method.toLowerCase() !== "get" &&
      obj.method.toLowerCase() !== "post"
    ) {
      throw new Error("请求方式必须是get或post");
    }
    if (obj.data !== undefined) {
      if (typeof obj.data === "string") {
        var str = obj.data;
      } else if (typeof obj.data === "object") {
        var str = "";
        for (var attr in obj.data) {
          str += "&" + attr + "=" + obj.data[attr];
        }
        str = str.slice(1);
      } else {
        throw new Error("数据必须是字符串或对象");
      }
      if (obj.method.toLowerCase() === "get") {
        obj.url += "?" + str;
      }
    }
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        if (xhr.status >= 200 && xhr.status < 300) {
          res = xhr.responseText;
          resolve(res);
        } else {
          reject();
        }
      }
    };
    xhr.open(obj.method, obj.url);
    if (obj.headers) {
      for (var attr in obj.headers) {
        xhr.setRequestHeader(attr, obj.headers[attr]);
      }
    }
    if (obj.method.toLowerCase() === "post" && obj.data) {
      xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
      xhr.send(str);
      return;
    }
    xhr.send();
  });
}
